﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Persistencia;
using UI.Views.Consultas;
using Dlls;
//using UI.Views.Relatorios;


namespace UI.Views.Cadastros
{
    /// <summary>
    /// Interaction logic for frmOrdemServico.xaml
    /// </summary>
    public partial class frmOrdemServico : Window
    {
        private Context context;
        private int codigoParaAlterarOuDeletar= 0 ;
        private List<OrdemServicoItem> listOrdemServicoItems;

        private OrdemServico ordemServico;
        private OrdemServicoItem ordemServicoItem;

        private OrdemServicoDLL ordemServicoDLL;
        private OrdemServicoItemDLL ordemServicoItemDLL;

        private PessoasDLL pessoasDLL;
        private ProdutosDLL produtosDLL;
        private Produto produto;
        private Estoque estoque;

        private string Tipo;
        private decimal totalEmProdutos;
        private decimal totalEmServicos;
        private decimal totalDaOS;

        public frmOrdemServico(int codigo)
        {
            InitializeComponent();
            context = new Context();
            listOrdemServicoItems = new List<OrdemServicoItem>();

            lblTotalProdutos_.Visibility = Visibility.Hidden;
            lblTotalServicos_.Visibility = Visibility.Hidden;
            lblTotalOS_.Visibility = Visibility.Hidden;

            lblTotalProdutos.Visibility = Visibility.Hidden;
            lblTotalServicos.Visibility = Visibility.Hidden;
            lblTotalOS.Visibility = Visibility.Hidden;
           
            //txtLote.Visibility = Visibility.Hidden;
            //txtCodigoOS.Visibility = Visibility.Hidden;
            //lblCodigoDaOS.Visibility = Visibility.Hidden;

            ordemServico = new OrdemServico();
            ordemServicoItem = new OrdemServicoItem();

            ordemServicoDLL = new OrdemServicoDLL();
            ordemServicoItemDLL = new OrdemServicoItemDLL();

            pessoasDLL = new PessoasDLL();

            lblDataAbertura.Content = DateTime.Now.ToShortDateString();
        }

        public void InsertOrUpdate(object sender,RoutedEventArgs e) 
        {
            if (codigoParaAlterarOuDeletar != 0)
            {

            }
            else 
            {
                ordemServico = new OrdemServico()
                {
                    Lote = int.Parse(txtLote.Text.ToString()),
                    DataAbertura = DateTime.Now,
                    PrevisaoEntrega = Convert.ToDateTime(txtPrevisaoEntrega.Text.ToString()),
                    NomeResponsavel = txtNomeResponsavel.Text.ToString(),
                    AutorizadoPor = txtAutorizadoPor.Text.ToString(),
                    ObservacaoOs = txtObservacao.Text.ToString(),
                    CodPessoa = int.Parse(txtCodigoCliente.Text.ToString()),
                    ReclamacaoCliente = txtDescricaoProblema.Text.ToString()
                };

                ordemServicoDLL.Insert(ordemServico);
                foreach (OrdemServicoItem item in listOrdemServicoItems) 
                {
                    item.CodOs = ordemServicoDLL.getLastInsertID();
                    ordemServicoItemDLL.Insert(item);
                }

                //0 = Os aberta, 1 = OS em execução , 2 = OS finalizada
                ordemServicoDLL.InserirOrdemServicoSituacao(0);
                ordemServicoDLL.InerirOrdemServicoAndamento(ordemServicoDLL.getLastInsertID(),0,1,0);//CodOs,Situacao,CodUsuario,CodItem

                dgwItensOS.ItemsSource = null;

                MessageBox.Show("Ordem Serviço registrada.");
                reset(0, this);
            }
        }

        public void Pesquisar(object sender, KeyEventArgs e) 
        {
            TextBox obj = sender as TextBox;
            
            if (e.Key == Key.Enter)
            {
                //Pesquisa Cliene
                if (obj.Name == "txtCodigoCliente")
                {
                    if(!obj.Text.Equals(""))
                    {
                        Pessoa cliente = pessoasDLL.getPessoa(int.Parse(txtCodigoCliente.Text.ToString()));
                        lblNomeDoCliente.Content = cliente.Nome + " / " + cliente.CPFCNPJ;
                    }
                    else
                    {
                        new frmConsultaPadrao("Pessoas").ShowDialog();
                        if (global.ReturnPessoa != null) 
                        {
                            lblNomeDoCliente.Content = global.ReturnPessoa.Nome + " / " + global.ReturnPessoa.CPFCNPJ;
                        }
                    }
                }
                else 
                {
                //Pesquisa Produtos ou Servicos
                    if (cbxTipo.SelectedIndex != 0)
                    {
                        if (cbxTipo.SelectedIndex == 1)
                        {
                            Tipo = "ProdutoOS";
                        }
                        else
                        {
                            Tipo = "Serviços";
                        }

                        if (!txtCodigoServicoProduto.Text.ToString().Equals(""))
                        { 

                            produtosDLL = new ProdutosDLL();
                            produto = produtosDLL.getProduto(int.Parse(txtCodigoServicoProduto.Text.ToString()));
                            estoque = new EstoqueDLL().ObterInfoProdutoDoEstoquePorId(produto.Codigo);

                            txtQtd.Focus();
                            txtCodigoServicoProduto.Text = produto.Codigo.ToString();
                            txtNomeServicoProduto.Text = produto.Nome;
                            //txtQtd.Text = "1";
                            txtValorUnitario.Text = estoque.ValorVenda.ToString();                      
                        }
                        else 
                        {
                            new frmConsultaPadrao(Tipo).ShowDialog();
                            if (global.ReturnProduto != null)
                            {
                                txtQtd.Focus();
                                produtosDLL = new ProdutosDLL();
                                produto = produtosDLL.getProduto(global.ReturnProduto.Codigo);
                                estoque = new EstoqueDLL().ObterInfoProdutoDoEstoquePorId(produto.Codigo);

                                txtCodigoServicoProduto.Text = produto.Codigo.ToString();
                                txtNomeServicoProduto.Text = produto.Nome;
                                //txtQtd.Text = "1";
                                txtValorUnitario.Text = estoque.ValorVenda.ToString();   
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Selecione o tipo.");
                    }
                }
            }
        }

        public void Delete(object sender, RoutedEventArgs e)
        {

        }

        public void Novo(object sender, RoutedEventArgs e)
        {
            reset(0,this);
        }

        private void txtQtd_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtQtd.Text.Equals(""))
                {
                    MessageBox.Show("Informe uma quantidade.");
                }
                else
                {
                    txtDescricaoProblema.Focus();
                }
            }
        }

        private void InserirItem(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtDescricaoProblema.Text.Equals(""))
                {
                    MessageBox.Show("Descreva o problema apresentado pelo cliente.");
                }
                else
                {
                    int quantidade = int.Parse(txtQtd.Text.ToString());
                    decimal valorUnitario = decimal.Parse(txtValorUnitario.Text.ToString());
                    decimal total = quantidade * valorUnitario;

                    OrdemServicoItem itemDaOS = new OrdemServicoItem()
                    {
                        CodProduto = int.Parse(txtCodigoServicoProduto.Text.ToString()),
                        Nome = txtNomeServicoProduto.Text.ToString(),
                        Quantidade = quantidade,
                        DescricaoProblema = txtDescricaoProblema.Text.ToString(),
                        ValorTotal = total,
                        ValorUnitario = Convert.ToDecimal(txtValorUnitario.Text),
                    };

                    AdicionarItemNaOS(itemDaOS);
                    dgwItensOS.ItemsSource = null;
                    dgwItensOS.ItemsSource = listOrdemServicoItems;
                    cbxTipo.SelectedIndex = 0;
                    
                    txtNomeServicoProduto.Text = "";
                    txtQtd.Text = "";
                    txtValorUnitario.Text = "";
                    txtDescricaoProblema.Text = "";
                }
            }
        }

        private void AdicionarItemNaOS(OrdemServicoItem item)
        {
            listOrdemServicoItems.Add(item);
        }

        private static void reset(int depth, DependencyObject obj)
        {
            // Percorre todos os filhos do objeto visual.
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                reset(depth + 1, VisualTreeHelper.GetChild(obj, i));

            // Se for um TextBox, limpa.
            if (obj is TextBox)
                ((TextBox)obj).Text = string.Empty;
        }

    }
}

